package logger

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

var log *zap.SugaredLogger

// InitLogger 初始化日志
func InitLogger() (string, error) {
	// 获取系统临时目录
	tempDir := os.TempDir()

	// 创建日志文件名（使用当前日期）
	timeStr := time.Now().Format("2006-01-02")
	logFileName := fmt.Sprintf("gopin-%s.log", timeStr)

	// 构建完整的日志文件路径
	logFilePath := filepath.Join(tempDir, logFileName)

	// 创建编码器配置
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "caller",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.CapitalLevelEncoder,
		EncodeTime:     zapcore.ISO8601TimeEncoder,
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeCaller:   zapcore.ShortCallerEncoder,
	}

	// 创建文件写入器
	file, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		return "", fmt.Errorf("无法创建日志文件: %v", err)
	}

	// 创建核心
	core := zapcore.NewCore(
		zapcore.NewJSONEncoder(encoderConfig),                                          // JSON 编码器
		zapcore.NewMultiWriteSyncer(zapcore.AddSync(file), zapcore.AddSync(os.Stdout)), // 同时写入文件和控制台
		zap.InfoLevel,
	)

	// 创建 logger
	logger := zap.New(core,
		zap.AddCaller(),                   // 添加调用者信息
		zap.AddCallerSkip(1),              // 跳过一层调用栈
		zap.AddStacktrace(zap.ErrorLevel), // 错误时记录堆栈
	)

	// 设置全局 logger
	log = logger.Sugar()

	// 记录启动日志
	Info("日志系统初始化完成",
		"logPath", logFilePath,
		"time", time.Now().Format(time.RFC3339),
	)

	return logFilePath, nil
}

// Sync 确保所有日志都被写入
func Sync() {
	if log != nil {
		log.Sync()
	}
}

// Debug 输出调试日志
func Debug(msg string, keysAndValues ...interface{}) {
	log.Debugw(msg, keysAndValues...)
}

// Info 输出信息日志
func Info(msg string, keysAndValues ...interface{}) {
	log.Infow(msg, keysAndValues...)
}

// Warn 输出警告日志
func Warn(msg string, keysAndValues ...interface{}) {
	log.Warnw(msg, keysAndValues...)
}

// Error 输出错误日志
func Error(msg string, keysAndValues ...interface{}) {
	log.Errorw(msg, keysAndValues...)
}

// Fatal 输出致命错误日志并退出程序
func Fatal(msg string, keysAndValues ...interface{}) {
	log.Fatalw(msg, keysAndValues...)
}

// Debugf 格式化输出调试日志
func Debugf(template string, args ...interface{}) {
	log.Debugf(template, args...)
}

// Infof 格式化输出信息日志
func Infof(template string, args ...interface{}) {
	log.Infof(template, args...)
}

// Warnf 格式化输出警告日志
func Warnf(template string, args ...interface{}) {
	log.Warnf(template, args...)
}

// Errorf 格式化输出错误日志
func Errorf(template string, args ...interface{}) {
	log.Errorf(template, args...)
}

// Fatalf 格式化输出致命错误日志并退出程序
func Fatalf(template string, args ...interface{}) {
	log.Fatalf(template, args...)
}
